# 一共有7个代码文件，每个文件对应一个最能体现的原则，请找出每个原则对应的代码文件，然后分析该代码文件是如何体现该原则的。

# 请将文件名修改为相应的原则名称，如：1.单一职责原则.py。并回答以下问题。然后将代码文件上传到之前实验创建的码云仓库中。
# 将码云代码仓库里新建文件夹code_snippets，将代码文件放入该文件夹中。

# 1.运行代码
# 输出如下：
# 用户 Alice 借阅了图书 B1001。  
# 用户 Alice 归还了图书 B1001。  
# 管理员 Bob 借阅了图书 B2002。  
# 管理员 Bob 归还了图书 B2002。  
# 管理员 Bob 添加了图书 B3003，书名: Python 编程。  
# 管理员 Bob 删除了图书 B3003。
# 2. 指出该代码体现了哪个原则
# 体现了接口隔离原则

# 3. 请说明该代码是如何体现该原则
# 定义了两个独立的接口：UserOperations 和 AdminOperations。UserOperations 接口包含了普通用户可能执行的操作（借书和还书），而 AdminOperations 接口包含了管理员特有的操作（添加和删除图书）。
# 普通用户类（RegularUser） 实现了 UserOperations 接口，但没有实现 AdminOperations 接口。这确保了普通用户对象不会包含与它们无关的管理员操作。
# 管理员类（Admin） 同时实现了 UserOperations 和 AdminOperations 接口。虽然这在某种程度上违反了“单一职责原则”（每个类应该只有一个引起它变化的理由），但在这种情况下，管理员确实需要执行用户和管理员两种角色的操作。不过，通过接口分离，我们仍然保持了系统的清晰性和灵活性，因为管理员类可以独立地扩展或修改其用户操作和管理员操作，而不会相互影响。
# 客户端代码（测试示例部分） 可以根据需要创建不同类型的对象（普通用户或管理员），并仅调用与这些对象相关的接口方法。这减少了客户端对不必要接口的依赖，并提高了代码的可读性和可维护性。

from abc import ABC, abstractmethod

# 定义用户操作的接口
class UserOperations(ABC):
    @abstractmethod
    def borrow_book(self, book_id):
        pass

    @abstractmethod
    def return_book(self, book_id):
        pass

# 定义管理员操作的接口
class AdminOperations(ABC):
    @abstractmethod
    def add_book(self, book_id, title):
        pass

    @abstractmethod
    def remove_book(self, book_id):
        pass

# 普通用户类，实现用户操作接口
class RegularUser(UserOperations):
    def __init__(self, user_id, name):
        self.user_id = user_id
        self.name = name

    def borrow_book(self, book_id):
        print(f"用户 {self.name} 借阅了图书 {book_id}。")

    def return_book(self, book_id):
        print(f"用户 {self.name} 归还了图书 {book_id}。")

# 管理员类，实现管理员操作接口和用户操作接口
class Admin(UserOperations, AdminOperations):
    def __init__(self, admin_id, name):
        self.admin_id = admin_id
        self.name = name

    # 用户操作
    def borrow_book(self, book_id):
        print(f"管理员 {self.name} 借阅了图书 {book_id}。")

    def return_book(self, book_id):
        print(f"管理员 {self.name} 归还了图书 {book_id}。")

    # 管理员操作
    def add_book(self, book_id, title):
        print(f"管理员 {self.name} 添加了图书 {book_id}，书名: {title}。")

    def remove_book(self, book_id):
        print(f"管理员 {self.name} 删除了图书 {book_id}。")

# 测试示例
if __name__ == "__main__":
    # 创建普通用户
    regular_user = RegularUser(user_id=101, name="Alice")
    
    # 创建管理员
    admin = Admin(admin_id=201, name="Bob")

    # 普通用户借书还书
    regular_user.borrow_book("B1001")
    regular_user.return_book("B1001")

    # 管理员借书还书
    admin.borrow_book("B2002")
    admin.return_book("B2002")

    # 管理员添加和删除图书
    admin.add_book("B3003", "Python 编程")
    admin.remove_book("B3003")
